package com.hotbitmapgg.moequest.utils;

import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.view.ViewCompat;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;

public class StatusBarCompat {

  private static final int COLOR_TRANSLUCENT = Color.parseColor("#00000000");

  public static final int DEFAULT_COLOR_ALPHA = 112;


  /**
   * set statusBarColor
   *
   * @param statusColor color
   * @param alpha 0 - 255
   */
  public static void setStatusBarColor(Activity activity, int statusColor, int alpha) {

    setStatusBarColor(activity, calculateStatusBarColor(statusColor, alpha));
  }


  public static void setStatusBarColor(Activity activity, int statusColor) {

    Window window = activity.getWindow();
    ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      //First translucent status bar.
      window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //After LOLLIPOP not translucent status bar
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //Then call setStatusBarColor.
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(statusColor);
        //set child View not fill the system window
        View mChildView = mContentView.getChildAt(0);
        if (mChildView != null) {
          ViewCompat.setFitsSystemWindows(mChildView, true);
        }
      } else {
        ViewGroup mDecorView = (ViewGroup) window.getDecorView();
        if (mDecorView.getTag() != null && mDecorView.getTag() instanceof Boolean &&
            (Boolean) mDecorView.getTag()) {
          //if has add fake status bar view
          View mStatusBarView = mDecorView.getChildAt(0);
          if (mStatusBarView != null) {
            mStatusBarView.setBackgroundColor(statusColor);
          }
        } else {
          int statusBarHeight = getStatusBarHeight(activity);
          //add margin
          View mContentChild = mContentView.getChildAt(0);
          if (mContentChild != null) {
            ViewCompat.setFitsSystemWindows(mContentChild, false);
            FrameLayout.LayoutParams lp
                = (FrameLayout.LayoutParams) mContentChild.getLayoutParams();
            lp.topMargin += statusBarHeight;
            mContentChild.setLayoutParams(lp);
          }
          //add fake status bar view
          View mStatusBarView = new View(activity);
          FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight);
          layoutParams.gravity = Gravity.TOP;
          mStatusBarView.setLayoutParams(layoutParams);
          mStatusBarView.setBackgroundColor(statusColor);
          mDecorView.addView(mStatusBarView, 0);
          mDecorView.setTag(true);
        }
      }
    }
  }


  public static void translucentStatusBar(Activity activity) {

    translucentStatusBar(activity, false);
  }


  /**
   * change to full screen mode
   *
   * @param hideStatusBarBackground hide status bar alpha Background when SDK > 21, true if hide it
   */
  public static void translucentStatusBar(Activity activity, boolean hideStatusBarBackground) {

    Window window = activity.getWindow();
    ViewGroup mContentView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);

    //set child View not fill the system window
    View mChildView = mContentView.getChildAt(0);
    if (mChildView != null) {
      ViewCompat.setFitsSystemWindows(mChildView, false);
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      int statusBarHeight = getStatusBarHeight(activity);

      //First translucent status bar.
      window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        //After LOLLIPOP just set LayoutParams.
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        if (hideStatusBarBackground) {
          window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
          window.setStatusBarColor(COLOR_TRANSLUCENT);
        } else {
          window.setStatusBarColor(calculateStatusBarColor(COLOR_TRANSLUCENT, DEFAULT_COLOR_ALPHA));
        }
        //must call requestApplyInsets, otherwise it will have space in screen bottom
        if (mChildView != null) {
          ViewCompat.requestApplyInsets(mChildView);
        }
      } else {
        ViewGroup mDecorView = (ViewGroup) window.getDecorView();
        if (mDecorView.getTag() != null && mDecorView.getTag() instanceof Boolean &&
            (Boolean) mDecorView.getTag()) {
          mChildView = mDecorView.getChildAt(0);
          //remove fake status bar view.
          mContentView.removeView(mChildView);
          mChildView = mContentView.getChildAt(0);
          if (mChildView != null) {
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mChildView.getLayoutParams();
            //cancel the margin top
            if (lp != null && lp.topMargin >= statusBarHeight) {
              lp.topMargin -= statusBarHeight;
              mChildView.setLayoutParams(lp);
            }
          }
          mDecorView.setTag(false);
        }
      }
    }
  }


  //Get status bar height
  public static int getStatusBarHeight(Context context) {

    int result = 0;
    int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resId > 0) {
      result = context.getResources().getDimensionPixelOffset(resId);
    }
    return result;
  }


  //Get alpha color
  private static int calculateStatusBarColor(int color, int alpha) {

    float a = 1 - alpha / 255f;
    int red = color >> 16 & 0xff;
    int green = color >> 8 & 0xff;
    int blue = color & 0xff;
    red = (int) (red * a + 0.5);
    green = (int) (green * a + 0.5);
    blue = (int) (blue * a + 0.5);
    return 0xff << 24 | red << 16 | green << 8 | blue;
  }
}
